package Servidor;

import java.util.ArrayList;
import Servidor.Tema;
import java.util.Date;

public class Examen {

	private Date _fechaInicial;
	private Date _fechaFinal;
	private boolean _enviado;
	private Profesor _profesor;
	private ArrayList<ExamenEspecifico> _listaExamenEspecificos = new ArrayList<ExamenEspecifico>();
	private ArrayList<InfoTema> _listaTemas = new ArrayList<InfoTema>();
	private Asignatura _asignatura;
	private boolean _corregido;
	private String _idExamen;
	static private int _COUNTER = 1;

	public Examen(Date aFechaIni, Date aFechaFin) {
		this._idExamen = " Examen_" + _COUNTER++;
		_fechaInicial = aFechaIni;
		_fechaFinal = aFechaFin;
		_corregido = false;
		_enviado = false;
	}

	public boolean getCorreccion() {
		return _corregido;
	}

	public Asignatura getAsignatura() {
		return _asignatura;
	}


	public ArrayList<ExamenEspecifico> getExamenesEspecificos() {
		return _listaExamenEspecificos;
	}

	public void corregirExamen() {
		ArrayList<Pregunta> preguntas;
		ArrayList<Respuesta> respuestaCorrecta;
		ArrayList<Respuesta> respuestaAlumno;

		for (int i = 0; i < _listaExamenEspecificos.size(); i++) {
			preguntas = _listaExamenEspecificos.get(i).getPreguntas();
			
			for (int j = 0; j < preguntas.size(); j++) {
				respuestaCorrecta = preguntas.get(j).getRespuestaCorrecta();
				respuestaAlumno = _listaExamenEspecificos.get(i).getRespuestaAlumno(preguntas.get(j));
				boolean correcto = true;

				if (respuestaAlumno.size() == respuestaCorrecta.size()) {

					for (int k = 0; k < respuestaCorrecta.size(); k++) {

						if (!respuestaAlumno.get(k).getEsCierta()) {
							correcto = false;
							break;
						}
					}

				} else {
					correcto = false;
				}

				if (correcto) {
					_listaExamenEspecificos.get(i).incrementarNota();
				} else {
					_listaExamenEspecificos.get(i).decrementarNota();
				}
			}
			
			_listaExamenEspecificos.get(i).getAlumno().removeAviso(_idExamen);
		}

		this.setCorregido(true);
		this.setEnviado(false);
	}

	public void setCorregido(boolean aB) {
		this._corregido = aB;
	}

	public void setEnviado(boolean aB) {
		this._enviado = aB;
	}

	public void addTema(Tema aTema, int aNumPreguntas) {
		_listaTemas.add(new InfoTema(this, aTema, aNumPreguntas));
	}

	public void setAsignatura(Asignatura aAsig) {
		this._asignatura = aAsig;
		_idExamen = _asignatura.getNombre() + _idExamen;
	}

	public Date getFechaInicial() {
		return this._fechaInicial;
	}

	public void setFechaInicial(Date aFechaInicial) {
		this._fechaInicial = aFechaInicial;
	}

	public Date getFechaFinal() {
		return this._fechaFinal;
	}

	public void setFechaFinal(Date aFechaFinal) {
		this._fechaFinal = aFechaFinal;
	}

	public void setProfesor(Profesor aProfesor) {
		this._profesor = aProfesor;
	}

	public PaqueteCORBA.InfoExamen[] getNotas() {
		PaqueteCORBA.InfoExamen[] listaNotas = new PaqueteCORBA.InfoExamen[_listaExamenEspecificos.size()];

		for (int i = 0; i < _listaExamenEspecificos.size(); i++) {
			ExamenEspecifico ee = _listaExamenEspecificos.get(i);

			float nota = ee.getNota();
			String nombreAlumno = ee.getNombreAlumno();

			PaqueteCORBA.InfoExamen infoExamen = new PaqueteCORBA.InfoExamen(ee.getExamen().getIdExamen(), nombreAlumno, nota);
			listaNotas[i] = infoExamen;
		}

		return listaNotas;
	}

	public ExamenEspecifico generarExamen(Alumno aA) throws Exception {
		ExamenEspecifico ee = new ExamenEspecifico(this);
		
		for (int i = 0; i < _listaTemas.size(); i++) {
			Tema tema = _listaTemas.get(i).getTema();
			int numPreguntas = this.getNumPreguntas(tema);
			
			Pregunta[] preguntas;
			//ojo: esta instrucción puede lanzar una excepción
			preguntas = tema.getPreguntas(numPreguntas);
			
			ee.addPreguntas(preguntas);			
		}
		
		ee.setAlumno(aA);
		aA.addExamen(ee);
                addExamenEspecifico(ee);
		
		return ee;
	}

	public int getNumPreguntas(Tema aT) {
		int numPreguntas = 0;
		
		for (int i = 0; i < _listaTemas.size(); i++) {
			if (_listaTemas.get(i).getTema() == aT)
				numPreguntas += _listaTemas.get(i).getNumPreguntas();
		}
		
		return numPreguntas;
	}
	
	public int getNumPreguntas() {
		int acum = 0;
		
		for (int i = 0; i < _listaTemas.size(); i++)
			acum += _listaTemas.get(i).getNumPreguntas();
		
		return acum;
	}

	public boolean getEnviado() {
		return this._enviado;
	}

	public ArrayList<Alumno> getAlumnos() {
		return _asignatura.getAlumnos();
	}

	public String getIdExamen() {
		return _idExamen;
	}

    ExamenEspecifico getExamenEspecifico(Alumno aAlu) {
        for (int i = 0; i < _listaExamenEspecificos.size(); i++) {
            if (_listaExamenEspecificos.get(i).getAlumno() == aAlu)
                return _listaExamenEspecificos.get(i);
        }
        
        return null;
    }

    Date getFecha() {
        return _fechaInicial;
    }

    private void addExamenEspecifico(ExamenEspecifico ee) {
        _listaExamenEspecificos.add(ee);
    }
	
	public int getNumExamenesRealizados() {
		int realizados = 0;
		
		for (int i = 0; i < _listaExamenEspecificos.size(); i++)
			realizados += (_listaExamenEspecificos.get(i).getTerminado()) ? 1 : 0;
			
		return realizados;
	}
}